home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / pao / towns / cdplay / src / sndplay.c < prev    next >
Text File  |  1991-10-18  |  6KB  |  187 lines

  1. /* << High C V1.4  &  386ASM V2.0 >> ******************************************
  2. **
  3. **    SND ファイルを再生します。
  4. **
  5. **    1991.03.19 : CREATE
  6. **    1991.03.19 : FINISH
  7. **
  8. **    < HISTORY >
  9. **    1991.03.19 : CREATE
  10. **    1991.03.25 : 音声を再生する時の音量を電子ボリュームの値と一緒にした.
  11. **
  12. **    < note > : TABS = 4
  13. **
  14. **    Programmed by Y.Hirata ( Nifty ID : NAB03321 )
  15. **
  16. ******************************************************************************/
  17.  
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include <snd.h>
  22. #include <dos.h>
  23. #include <msdos.cf>
  24. #include "cdpn.h"
  25. #include "sndplay.h"
  26.  
  27. /*-----------------------------------------------------------------------------
  28. **    SND BIOS の初期化および電子ボリュームの設定は、呼び側で行っておいて下さい.
  29. -----------------------------------------------------------------------------*/
  30.  
  31. #define    PCM_MAXCH        8                        /*  PCM チャンネル数                */
  32.  
  33. static int    Sndsize[PCM_MAXCH] ;                /*  PCM 音声データサイズ        */
  34. static char    *Snddata[PCM_MAXCH] ;                /*  PCM 音声格納領域        */
  35.  
  36. struct _SNDPLAY_DATA {
  37.     char    name[8] ;                            /*  サウンドネーム                */
  38.     ulong    sid ;                                /*  サウンドID                    */
  39.     ulong    len ;                                /*  データ幅                    */
  40.     ulong    loop_p ;                            /*  ループポイント                */
  41.     ulong    loop_len ;                            /*  ループレングス                */
  42.     ushort    sf ;                                /*  サンプリング周波数            */
  43.     short    hosei ;                                /*  原音の補正(ピッチベンド)    */
  44.     uchar    onkai ;                                /*  原音の音階                */
  45.     uchar    flg ;                                /*  ?フラグ                    */
  46. } ;
  47.  
  48. union _SNDPLAY_CHECK {
  49.     struct _SNDPLAY_DATA    data ;
  50.     char                    buf[30] ;
  51. } SNDPLAY_check[PCM_MAXCH] ;
  52.  
  53. static char    SNDPLAY_loadflg[PCM_MAXCH] = {    FALSE, FALSE, FALSE, FALSE ,
  54.                                             FALSE, FALSE, FALSE, FALSE } ;
  55.  
  56. /*************************  DTAの設定  ************************************/
  57. void SNDPLAY_setdta( SNDPLAY_DTA *p )
  58. {
  59.     Registers.AX.LH.H = 0x1a ;
  60.     Registers.DX.R = (uint)p ;
  61.     Registers.DS.R = getds() ;
  62.     calldos() ;
  63. }
  64.  
  65. /*******************  最初に一致するファイル名の検索  ************************/
  66. int SNDPLAY_firstsearch( char *path,int attr,SNDPLAY_DTA *dta )
  67. /*=============================================================================
  68. **    最初に一致するファイル名の検索を行う.
  69. **
  70. **    < INPUT  > : path    検索パス
  71. **               : attr    検索ファイル属性
  72. **    < OUTPUT > : dta    DTA格納領域
  73. **    < RETURN > : ファイルが検索できたら 真値 , みつからなければ 偽値
  74. =============================================================================*/
  75. {
  76.     SNDPLAY_setdta( dta ) ;
  77.     Registers.AX.LH.H = 0x4e ;
  78.     Registers.CX.R = attr ;                        /*  ファイルの種類    */
  79.     Registers.DX.R = (uint)path ;                /*  ファイル名        */
  80.     Registers.DS.R = getds() ;
  81.     calldos();
  82.     if ( (Registers.Flags & 0x0001) != 0 )
  83.         return ( FALSE ) ;
  84.     else
  85.         return ( TRUE ) ;                    /*  成功ならば 真 でreturn    */
  86. }
  87.  
  88. /***************************  ファイルサイズ取得  ****************************/
  89. int SNDPLAY_getfsize( int ch,char *fname )
  90. /*=============================================================================
  91. **    ファイルサイズの取得を行う.
  92. **
  93. **    < INPUT  > : fname    ファイル名
  94. **               : ch        チャンネル ( 71 ~ 64 )
  95. **    < OUTPUT > : なし
  96. **    < RETURN > : ファイルサイズ( ファイルが見つからない場合には、-1 )
  97. =============================================================================*/
  98. {
  99.     SNDPLAY_DTA    dta ;
  100.     ushort    attr=0 ;
  101.  
  102.     if ( SNDPLAY_firstsearch( fname,attr,&dta ) ) {    /*  最初のエントリ    */
  103.         Sndsize[71-ch] = dta._fsize ;
  104.         return( dta._fsize ) ;
  105.     } else {                                    /*  ファイルが見つからない    */
  106.         return( -1 ) ;
  107.     }
  108. }
  109.  
  110. /***************************  SND DATA の読込み  *****************************/
  111. int SNDPLAY_load( int ch,char *fname )
  112. /*=============================================================================
  113. **    SNDファイルを読み込む.
  114. **
  115. **    < INPUT  > : fname    ファイル名
  116. **               : ch        チャンネル ( 71 ~ 64 )
  117. **    < OUTPUT > : なし
  118. **    < RETURN > : ファイルが読み込めたら 真値 , 読み込めなければ 偽値
  119. =============================================================================*/
  120. {
  121.     FILE *fp;
  122.  
  123.     if ( SNDPLAY_getfsize( ch,fname ) == -1 ) return( FALSE ) ;
  124.  
  125.     if ( SNDPLAY_loadflg[71-ch] ) {
  126.         SNDPLAY_loadflg[71-ch] = FALSE ;
  127.         free( Snddata[71-ch] ) ;
  128.     }
  129.     Snddata[71-ch] = malloc( Sndsize[71-ch] ) ;    /*  SND データ格納領域確保    */
  130.     if ( Snddata[71-ch] == NULL ) {
  131.         return( FALSE ) ;
  132.     } else {
  133.         SNDPLAY_loadflg[71-ch] = TRUE ;
  134.         fp = fopen( fname,"rb" ) ;
  135.         fread( Snddata[71-ch],1,Sndsize[71-ch],fp ) ;
  136.         fclose( fp ) ;
  137.     }
  138.  
  139.     memcpy( SNDPLAY_check[71-ch].buf,Snddata[71-ch],30 ) ;
  140.  
  141.     return( TRUE ) ;
  142. }
  143.  
  144. /*****************************  SND DATA の再生  *****************************/
  145. int SNDPLAY_play( int ch,char *fname )
  146. /*=============================================================================
  147. **    SNDファイルを再生する.
  148. **
  149. **    < INPUT  > : fname    ファイル名
  150. **               : ch        チャンネル ( 71 ~ 64 )
  151. **    < OUTPUT > : なし
  152. **    < RETURN > : 再生できたら 真値 , 再生できなければ 偽値
  153. =============================================================================*/
  154. {
  155.     int        vol ;
  156.  
  157.     if ( !SNDPLAY_load( ch,fname ) ) return( FALSE ) ;
  158.  
  159.     SND_pcm_play_stop( ch ) ;
  160.     if ( Flg.mute ) {                                    /*  ミュート中            */
  161.         vol = ZERO ;                        /*  最小値とする                */
  162.     } else {
  163.         vol = Evol ;                        /*  電子ボリューム値と同じにする    */
  164.     }
  165.     SND_pcm_play( ch,SNDPLAY_check[71-ch].data.onkai,vol,Snddata[71-ch] ) ;
  166.  
  167.     return( TRUE ) ;
  168. }
  169.  
  170. /*****************************  SND DATA の停止  *****************************/
  171. void SNDPLAY_stop( int ch )
  172. /*=============================================================================
  173. **    SNDファイルの再生を停止する.
  174. **
  175. **    < INPUT  > : チャンネル ( 71 ~ 64 )
  176. **    < OUTPUT > : なし
  177. **    < RETURN > : なし
  178. =============================================================================*/
  179. {
  180.     if ( SNDPLAY_loadflg[71-ch] ) {
  181.         SND_pcm_play_stop( ch ) ;
  182.         SNDPLAY_loadflg[71-ch] = FALSE ;
  183.         free( Snddata[71-ch] ) ;
  184.     }
  185. }
  186.  
  187.